/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under Ultimate Liberty license
  * SLA0044, the "License"; You may not use this file except in compliance with
  * the License. You may obtain a copy of the License at:
  *                             www.st.com/SLA0044
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "cmsis_os.h"
#include "adc.h"
#include "dma.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
#include "ch9121_driver.h"
#include "modbus_tcp_ll.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
#include "queue.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
extern uint16_t rtu_buff[1090]	;
extern uint16_t modbue_Baud;
uint8_t aa = 1;
uint8_t bb = 20;
/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

int fputc(int ch,FILE *f)
{

	LL_USART_TransmitData8(USART2, ch);
		while(!LL_USART_IsActiveFlag_TXE(USART2))
		{

		}
	return ch;
}

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
void MX_FREERTOS_Init(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

uint16_t aADCxConvertedData[7];


uint8_t init_status =0;
xQueueHandle xQueueRx_pc_uart1;
xQueueHandle xQueueRx_bms_uart2;
xQueueHandle xQueueRx_ac_uart3;

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
	 init_status=0;

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
	  LL_GPIO_ResetOutputPin(GPIOC, RUN_LED_Pin|FL_LED_Pin|CH_LED_Pin);

  /**/
  LL_GPIO_ResetOutputPin(GPIOA, EN_BAT_Pin);
  LL_GPIO_SetOutputPin(GPIOA, I2C_SCL_Pin);
  /**/
  LL_GPIO_ResetOutputPin(GPIOB, CNT2_Pin|CNT1_Pin|EN_AC_Pin
                          |POW60_LED_Pin|POW80_LED_Pin|POW_LED_Pin|POW40_LED_Pin|EN_CH_Pin);
	LL_GPIO_SetOutputPin(GPIOB, I2C_SDA_Pin|CFG_Pin);

  /**/
  LL_GPIO_SetOutputPin(POW20_LED_GPIO_Port, POW20_LED_Pin);

  MX_DMA_Init();
  MX_ADC1_Init();
  MX_TIM1_Init();
  MX_TIM3_Init();
  MX_USART1_UART_Init();
  MX_USART2_UART_Init();
  
  // 初始化USART1的DMA发送功能
  USART1_DMA_Init();
//	LL_USART_EnableIT_RXNE(USART1); 
//	LL_USART_EnableIT_TXE(USART1); 
  /* USER CODE BEGIN 2 */
//LL_USART_TransmitData8(USART1,aa);
//	aa++;
//LL_USART_TransmitData8(USART1,aa);	

		
	printFlashTest();
	rtu_buff[3] = 0xFFFF;
	rtu_buff[153] = 0xA1;
	init_status =1;
	init_status =1;
	 LL_mDelay(100);
	 CH9121_Config config;
    // ��ȡ CH9121 ����
    CH9121_ReadConfig(&config);
//	LL_USART_TransmitData8(USART1,aa);

rtu_buff[141] = (uint16_t)config.mac_address[0];
rtu_buff[142] = (uint16_t)config.mac_address[1];
rtu_buff[143] = (uint16_t)config.mac_address[2];
rtu_buff[144] = (uint16_t)config.mac_address[3];
rtu_buff[145] = (uint16_t)config.mac_address[4];
rtu_buff[146] = (uint16_t)config.mac_address[5];
rtu_buff[147] = (uint16_t)config.ip_address[0];
rtu_buff[148] = (uint16_t)config.ip_address[1];
rtu_buff[149] = (uint16_t)config.ip_address[2];
rtu_buff[150] = (uint16_t)config.ip_address[3];
//rtu_buff[151] = config.port;

LL_mDelay(100);
//LL_USART_DisableIT_RXNE(USART1);
//LL_USART_DisableIT_TXE(USART1);
// ����USART1���޸Ĳ�����ǰ������ã�
  LL_USART_Disable(USART1);
  LL_USART_InitTypeDef USART_InitStruct = {0};
  LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; 
  USART_InitStruct.BaudRate = modbue_Baud*100;
  USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;
  USART_InitStruct.StopBits = LL_USART_STOPBITS_1;
  USART_InitStruct.Parity = LL_USART_PARITY_NONE;
  USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;
  USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
  USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;
  LL_USART_Init(USART1, &USART_InitStruct);
  LL_USART_ConfigAsyncMode(USART1);
  LL_USART_Enable(USART1);
    // ����ʹ��USART1
 //   LL_USART_Enable(USART1);
//	aa++;
//	LL_USART_TransmitData8(USART1,aa);	
//	aa++;
  /* USER CODE END 2 */

  /* Init scheduler */
  osKernelInitialize();  /* Call init function for freertos objects (in freertos.c) */
	
	
  MX_FREERTOS_Init();
	
  /* Start scheduler */
  osKernelStart();

  /* We should never get here as control is now taken by the scheduler */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
  PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */

  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
